<?php

/**
 * Description of Laboratorio
 *
 * @author markos
 */
class VirtualLabs_Admin_Laboratorio extends VirtualLabs_Admin_Dao {

    const ROL_PROFESOR = 3;
    const ROL_ADMIN = 5;
    const ROL_ALUMNO = 1;
    const TABLE_NAME = 'laboratorio';

    public function deleteGrupoVm($codigoLaboratorio) {
        $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
//            "{$code['key']} = ?" => 
            $logger->debug("codigo-laboratorio $codigoLaboratorio");
            $select = $db->select()->from(array('gpvm' => 'grupo_perfil_vm', array('codigo_grupo_perfil_vm')));
            $select->where("codigo_laboratorio = ?", $codigoLaboratorio['value']);
            $logger->debug($select);
            $result = $db->fetchAll($select);
            foreach ($result as $r) {
                $codigoGrupoPerfilVm = $r['codigo_grupo_perfil_vm'];
                $db->delete("perfil_vm", array("CODIGO_GRUPO_PERFIL_VM = ?" => $codigoGrupoPerfilVm));
                $db->delete("grupo_perfil_vm", array("CODIGO_GRUPO_PERFIL_VM = ?" => $codigoGrupoPerfilVm));
            }
            return true;
        } catch (Exception $e) {

            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    public function getCodigoProyecto($codigo_laboratorio) {
        $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            $select = $db->select()->from(array('l' => 'laboratorio', array('codigo_proyecto')));
            $select->where("codigo_laboratorio = ?", $codigo_laboratorio);
            $logger->debug($select);
            $result = $db->fetchRow($select);

            return $result['codigo_proyecto'];
        } catch (Exception $e) {
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * Vefica si el $username esta asociado bajo un $codigoRol opcional en $codigoLaboratorio
     * 
     * @param string $username
     * @param int $codigoLaboratorio
     * @param int $codigoRol
     */
    public function isMemberInLab($username, $codigoLaboratorio, $codigoRol = null) {
        $db = Zend_Db_Table::getDefaultAdapter();

        $select = $db->select()->from(array('u' => 'usuario', array('username')))
                ->join(array('ml' => 'miembro_laboratorio'), 'u.username = ml.username', array());
        $select->where("codigo_laboratorio = ?", $codigoLaboratorio);
        $select->where("u.username = ?", $username);
        if ($codigoRol) {
            $select->where("ml.codigo_rol = ?", $codigoRol);
        }

        try {
            $debug = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debug->debug("[ isMemberInLab ] $select");
            $retorno = $db->fetchAll($select);
            if (count($retorno) > 0) {
                return true;
            }
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            return false;
        }
        return false;
    }

    /**
     * Lista todos los alumnos en un laboratorio $codigoLaboratorio.
     * 
     * @param int $codigoLaboratorio
     * @return array responde array(array(username,nombre,apellido,email))
     * @throws Exception
     */
    public function getAlumnosInLaboratorio($codigoLaboratorio) {
        $db = Zend_Db_Table::getDefaultAdapter();

        $select = $db->select()->from(array('u' => 'usuario', array('username', 'nombre', 'apellido', 'email')))
                ->join(array('ml' => 'miembro_laboratorio'), 'u.username = ml.username', array());
        $select->where("codigo_laboratorio = ?", $codigoLaboratorio);
        $select->where("ml.codigo_rol = ?", self::ROL_ALUMNO);

        try {
            $debug = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debug->debug("[ getAlumnoByLaboratorio ] $select");
            return $db->fetchAll($select);
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * 
     */
    public function getLaboratoriosByAlumno($codigoLaboratorio, $username = null) {
        $db = Zend_Db_Table::getDefaultAdapter();

        $select = $db->select()->from(array('l' => 'laboratorio', array('nombre', 'nombre_mostrar')))
                ->join(array('ml' => 'miembro_laboratorio'), 'l.codigo_laboratorio = ml.codigo_laboratorio', array());
        $select->where("codigo_laboratorio = ?", $codigoLaboratorio);
        if ($username) {
            $select->where("username = ?", $username);
        }
        try {
            $debug = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debug->debug("[ getLaboratorioByAlumno ] $select");
            return $db->fetchAll($select);
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * Guarda los datos generales de un laboratorio en base de datos.
     * En caso $codigoLaboratorio este seteado se realiza un update utilizando 
     * este valor como condicion de busqueda, caso contrario realiza 
     * un insert en la base de datos.
     * 
     * @param type $data datos de la tabla 'laboratorio'
     * @throws Exception
     * @return array los valores almanados en caso de realizar las operaciones correctamente
     */
    public function save($data, $codigoLaboratorio = null) {
        try {
            $db = Zend_Db_Table::getDefaultAdapter();
            if (!is_null($codigoLaboratorio)) {
                $db->update("laboratorio", $data, "codigo_laboratorio = $codigoLaboratorio");
                $data['codigo_laboratorio'] = $codigoLaboratorio;
            } else {
                $db->insert("laboratorio", $data);
                $data['codigo_laboratorio'] = $db->lastInsertId("laboratorio");
            }
            return $data;
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * 
     * @param type $fields
     * @param type $where
     * @return type
     * @throws Exception
     */
    public function getLaboratorios($fields = array(), $where = array()) {
        $db = Zend_Db_Table::getDefaultAdapter();
        $select = $db->select()->from("laboratorio", $fields);
        try {
            foreach ($where as $key => $value) {
                $select->where("$key {$value['criteria']} ?", $value['value']);
            }
            $debug = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debug->debug("[ getLaboratorio ] $select");
            return $db->fetchAll($select);
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * 
     * @param type $fields
     * @param type $where
     * @return type
     * @throws Exception
     */
    public function getLaboratorio($fields = array(), $where = array()) {
        $db = Zend_Db_Table::getDefaultAdapter();
        $select = $db->select()->from("laboratorio", $fields);
        foreach ($where as $key => $value) {
            $select->where("$key {$value['criteria']} ?", $value['value']);
        }

        try {
            return $db->fetchRow($select);
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * Recupera los datos de los miembros asociados al laboratorio (administradores y profesores).
     * 
     * @param type $codigoLaboratorio
     * @return type
     * @throws Exception
     */
    public function getMembers($codigoLaboratorio) {
        $db = Zend_Db_Table::getDefaultAdapter();
        $select = $db->select()->from("miembro_laboratorio"); // al no tener nada en el parametro de campos trae todos los campos
        $select->where("codigo_laboratorio = ?", $codigoLaboratorio);

        try {
            $debug = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debug->debug("[ getLaboratorio ] $select");
            return $db->fetchAll($select);
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    public function getVMs($codigoLaboratorio) {
        $db = Zend_Db_Table::getDefaultAdapter();
        $select = $db->select()->from("maquina_virtual"); // al no tener nada en el parametro de campos trae todos los campos
        $select->where("codigo_laboratorio = ?", $codigoLaboratorio);

        try {
            $debug = Zend_Registry::get(VirtualLabs_Common::DEBUG_LOG);
            $debug->debug("[ getLaboratorio ] $select");
            return $db->fetchAll($select);
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * Elimina la asociacion existente entre un $username, que puede estar tambien condicionado a un $codigoRol especifico
     * para un $codigoLaboratorio enviado como parametro.
     * 
     * @param type $username identificador de usuario a desasociar
     * @param type $codigoLaboratorio codigo de laboratorio en cuestion
     * @param type $codigoRol=null codigo de roll opcional
     */
    public function desasociarMiembro($username, $codigoLaboratorio, $codigoRol = null) {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            if ($codigoRol) {
                $db->delete('miembro_laboratorio', array('codigo_laboratorio = ?' => $codigoLaboratorio, 'username = ?' => $username, 'codigo_rol = ?' => $codigoRol));
            } else {
                $db->delete('miembro_laboratorio', array('codigo_laboratorio = ?' => $codigoLaboratorio, 'username = ?' => $username));
            }
            
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * Asocia los username de los profesores encargados del curso al $codigoLaboratorio dado
     * 
     * @param array $members arreglo de username de los profesores
     * @param int $codigoLaboratorio codigo del laboratorio al cual se asocian los profesores
     * @param string $username_creador username creador
     * @throws Exception
     */
    public function saveMembers($members, $codigoLaboratorio, $username_creador = 'markosbenitez') {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            $db->delete('miembro_laboratorio', array('codigo_laboratorio = ?' => $codigoLaboratorio));
            foreach ($members as $value) {
                $data = array('codigo_laboratorio' => $codigoLaboratorio,
                    'username' => $value, 'codigo_rol' => self::ROL_PROFESOR, 'username_creador' => $username_creador);
                $db->insert("miembro_laboratorio", $data);
            }
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * Asocia los username de los miembros del curso al $codigoLaboratorio enviado.
     * 
     * @param array $member arreglo array(username, rol) de los miembros a asociar con el rol que sera asociado
     * @param int $codigoLaboratorio codigo del laboratorio al cual se asocian los profesores
     * @param string $username_creador username creador
     * @throws Exception
     */
    public function agregarMiembro($miembro, $codigoLaboratorio, $username_creador = 'markosbenitez') {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            $data = array('codigo_laboratorio' => $codigoLaboratorio,
                'username' => $miembro['username'], 'codigo_rol' => $miembro['rol'], 'username_creador' => $username_creador);
            $db->insert("miembro_laboratorio", $data);
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * Asocia los username de los miembros del curso al $codigoLaboratorio enviado. No elimina los miembros asociados previamente.
     * 
     * @param array $members arreglo de array(username, rol) de los miembros a asociar con el rol que sera asociado
     * @param int $codigoLaboratorio codigo del laboratorio al cual se asocian los profesores
     * @param string $username_creador username creador
     * @throws Exception
     */
    public function agregarMiembros($miembros, $codigoLaboratorio, $username_creador = 'markosbenitez') {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            foreach ($miembros as $value) {
                $data = array('codigo_laboratorio' => $codigoLaboratorio,
                    'username' => $value['username'], 'codigo_rol' => $value['rol'], 'username_creador' => $username_creador);
                $db->insert("miembro_laboratorio", $data);
            }
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    /**
     * Asocia los username de los miembros del curso al $codigoLaboratorio enviado. Previamente elimina todos los miembros asociados.
     * 
     * @param array $members arreglo de array(username, rol) de los miembros a asociar con el rol que sera asociado
     * @param int $codigoLaboratorio codigo del laboratorio al cual se asocian los profesores
     * @param string $username_creador username creador
     * @throws Exception
     */
    public function asociarMiembros($miembros, $codigoLaboratorio, $username_creador = 'markosbenitez') {
        $db = Zend_Db_Table::getDefaultAdapter();
        try {
            $db->delete('miembro_laboratorio', array('codigo_laboratorio = ?' => $codigoLaboratorio));
            foreach ($miembros as $value) {
                $data = array('codigo_laboratorio' => $codigoLaboratorio,
                    'username' => $value['username'], 'codigo_rol' => $value['rol'], 'username_creador' => $username_creador);
                $db->insert("miembro_laboratorio", $data);
            }
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    public function deleteLab($codigoLaboratorio) {
        //$db = Zend_Db_Table::getDefaultAdapter();
        try {
            $this->delete(VirtualLabs_Admin_Laboratorio::TABLE_NAME, $codigoLaboratorio);
            return true;
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    public function deleteMiembrosLab($codigoLaboratorio) {
        try {
            $this->delete('miembro_laboratorio', $codigoLaboratorio);
            return true;
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

    public function deleteRedLab($codigoLaboratorio) {
        try {
            $this->delete('red_laboratorio', $codigoLaboratorio);
            return true;
        } catch (Exception $e) {
            $logger = Zend_Registry::get(VirtualLabs_Exception::ERROR_LOG);
            $logger->err($e->getMessage());
            $logger->err($e->getTraceAsString());
            throw $e;
        }
    }

}
?>

